import os
import re
from PIL import Image

def adjust_image_width(image_path):
    """
    调整图片宽度为偶数（如果是奇数），使用复制最右列像素方法
    
    Args:
        image_path: 图片文件路径
    
    Returns:
        tuple: (是否修改, 原始尺寸, 新尺寸)
    """
    try:
        with Image.open(image_path) as img:
            width, height = img.size
            
            if width % 2 == 1:
                new_width = width + 1
                # 创建新图像（保持原模式）
                new_img = Image.new(img.mode, (new_width, height))
                
                # 复制调色板（如果是P模式）
                if img.mode == 'P':
                    new_img.putpalette(img.getpalette())
                
                # 粘贴原始图像
                new_img.paste(img, (0, 0))
                
                # 复制最右列像素到新位置
                if width > 0:  # 确保宽度至少为1
                    right_column = img.crop((width-1, 0, width, height))
                    new_img.paste(right_column, (width, 0, new_width, height))
                
                # 保存图像（移除无效的quality参数）
                new_img.save(image_path, format=img.format)
                return True, (width, height), (new_width, height)
            
            return False, (width, height), (width, height)
            
    except Exception as e:
        print(f"处理图片 {image_path} 时出错: {str(e)}")
        return False, None, None

def rename_to_standard_format(file_path):
    """
    将文件重命名为标准格式（an.png，其中n是0-9的数字）
    
    Args:
        file_path: 原始文件路径
    
    Returns:
        tuple: (是否重命名, 新文件名)
    """
    try:
        directory = os.path.dirname(file_path)
        filename = os.path.basename(file_path)
        
        # 检查是否已经是标准格式（大小写不敏感）
        if re.match(r'^a\d\.png$', filename, re.IGNORECASE):
            return False, filename
        
        # 提取第一个有效数字（0-9）
        match = re.search(r'[^0-9]*([0-9])', filename)
        if match:
            number = match.group(1)
            new_filename = f"a{number}.png"
            new_path = os.path.join(directory, new_filename)
            
            # 如果文件名相同（忽略大小写）则不重命名
            if filename.lower() == new_filename.lower():
                return False, filename
                
            # 处理目标文件已存在的情况
            if os.path.exists(new_path):
                # 避免删除自身（大小写不同）
                if os.path.abspath(file_path).lower() != os.path.abspath(new_path).lower():
                    os.remove(new_path)
                else:
                    return False, filename
                    
            os.rename(file_path, new_path)
            return True, new_filename
        
        return False, filename
        
    except Exception as e:
        print(f"重命名文件 {file_path} 时出错: {str(e)}")
        return False, os.path.basename(file_path)

def process_directory(directory):
    """
    处理指定目录及其子目录中的所有PNG文件
    
    Args:
        directory: 要处理的目录
    
    Returns:
        tuple: (重命名文件数, 修改尺寸文件数, 总PNG文件数)
    """
    renamed_count = 0
    modified_count = 0
    total_png_count = 0
    
    for root, _, files in os.walk(directory):
        png_files = [f for f in files if f.lower().endswith('.png')]
        total_png_count += len(png_files)
        
        if not png_files:
            continue
            
        rel_path = os.path.relpath(root, directory)
        path_prefix = f"{rel_path}{os.sep}" if rel_path != '.' else ""
        
        for png_file in png_files:
            file_path = os.path.join(root, png_file)
            
            # 先重命名
            renamed, new_name = rename_to_standard_format(file_path)
            if renamed:
                renamed_count += 1
                print(f"已重命名: {path_prefix}{png_file} -> {new_name}")
                file_path = os.path.join(root, new_name)  # 更新文件路径
                png_file = new_name  # 更新文件名
            
            # 再调整尺寸
            modified, old_size, new_size = adjust_image_width(file_path)
            if modified:
                modified_count += 1
                print(f"已修改尺寸: {path_prefix}{png_file}: {old_size[0]}x{old_size[1]} -> {new_size[0]}x{new_size[1]}")
    
    return renamed_count, modified_count, total_png_count

def main():
    current_dir = os.getcwd()
    print("开始处理PNG文件（包括子目录）...\n")
    
    renamed_count, modified_count, total_png_count = process_directory(current_dir)
    
    print("\n处理完成:")
    print(f"- 扫描PNG文件总数: {total_png_count}")
    print(f"- 重命名文件数: {renamed_count}")
    print(f"- 修改尺寸文件数: {modified_count}")
    print(f"- 未处理文件数: {total_png_count - renamed_count - modified_count}")

if __name__ == "__main__":
    main()